/*
 * @Author: jiu yin
 * @Date: 2025-01-08 10:06:05
 * @FilePath: \studio-web-admin\electron\node-socket-service\src\service.js
 * @LastEditTime: 2025-02-20 18:27:29
 * @LastEditors: jiu yin zhen jing
 */
const path = require("path");
const winston = require("winston");
const fs = require("fs");
const {rootPath}= require("../utils.js");

const dirname = path.join(rootPath, "logs");
// 使用绝对路径，避免相对路径的问题
const logPath = path.join(rootPath, "logs", "node_udp_hyx.log");
console.log("[ logPath ] >", logPath);

try {
	if (!fs.existsSync(dirname)) {
		fs.mkdirSync(dirname, { recursive: true });
	}
	// 测试写入权限
	fs.accessSync(dirname, fs.constants.W_OK);
} catch (error) {
	console.error("创建日志目录失败:", error);
	throw error; // 如果连项目目录都写不了，直接抛出错误
}

const logger = winston.createLogger({
	// 设置日志级别：debug < info < warn < error
	level: "info",

	// 组合多个格式化器
	format: winston.format.combine(
		// 添加时间戳
		winston.format.timestamp({
			format: "YYYY-MM-DD HH:mm:ss", // 时间格式
		}),
		// 修改格式化器来支持多参数和对象
		winston.format.printf(info => {
			// 处理额外参数
			const args = info[Symbol.for("splat")];

			// 格式化消息
			const formatMessage = msg => {
				if (typeof msg === "object") {
					// 为对象添加颜色
					const coloredJson = JSON.stringify(msg)
					return coloredJson;
				}
				return msg;
			};

			// 格式化所有参数
			const formattedArgs = args ? args.map(arg => formatMessage(arg)).join(" ") : "";

			// 组合最终消息
			const message = `${info.timestamp} ${info.level}: ${formatMessage(info.message)} ${formattedArgs}`;
			return message;
		})
	),

	transports: [
		// 文件输出配置
		new winston.transports.File({
			filename: logPath, // 日志文件路径
			maxsize: 5242880, // 单个文件最大大小：5MB
			maxFiles: 5, // 保留的最大文件数
			tailable: true, // 允许查看日志文件末尾
			zippedArchive: true, // 压缩旧的日志文件
			options: {
				flags: "a", // 'a' = append（追加模式）
				prepend: true, // 新日志添加到文件开头
			},
		}),
		new winston.transports.Console(),
	],
});
module.exports = logger;
